const co = require('co');
const fs = require('fs');

const stream = fs.createReadStream('./007.txt');
let valjeanCount = 0;

co(function*() {
  while(true) {
    const res = yield Promise.race([
      new Promise(resolve => stream.once('data', resolve)),
      new Promise(resolve => stream.once('end', resolve)),
      new Promise((resolve, reject) => stream.once('error', reject))
    ]);
    if (!res) {
      break;
    }
    stream.removeAllListeners('data');
    stream.removeAllListeners('end');
    stream.removeAllListeners('error');
    valjeanCount += (res.toString().match(/皮卡丘/ig) || []).length;  //i 可以忽略大小写 g 是全局
  }
  console.log('count:', valjeanCount); // count: 13
});

//Node 提供Stream 模式读写数据
//上面代码采用 Stream 模式读取 007.txt  
//对于每个数据块都使用stream.once方法，在data、end、error三个事件上添加一次性回调函数。变量res只有在data事件发生时才有值，然后累加每个数据块之中 [皮卡丘] 这个词出现的次数